package bdsimple.impl.mysql;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import bdsimple.abstractfactory.AbstractFactoryDAO;
import bdsimple.dao.base.CiudadDAO;
import bdsimple.dao.base.PropiedadDAO;
import bdsimple.dao.base.PropiedadVampiroDAO;
import bdsimple.dao.base.VampiroDAO;
import bdsimple.dto.base.CiudadDTO;
import bdsimple.dto.base.PropiedadDTO;
import bdsimple.dto.base.PropiedadVampiroDTO;
import bdsimple.dto.base.VampiroDTO;
import dao.base.api.IDTO;
import dao.base.impl.Reference;

public class PropiedadVampiroDAOImpl extends MySQLBaseDAO implements
		PropiedadVampiroDAO {

	public PropiedadVampiroDAOImpl() {
		super(PropiedadVampiroDTO.class);
	}

	@Override
	protected String createInsertCollst(IDTO dto) throws Exception {

		StringBuffer strbuf = new StringBuffer();

		strbuf.append(PropiedadVampiroDTOImpl.NUMERO_SIRVIENTES);
		strbuf.append(", ");
		strbuf.append(PropiedadVampiroDTOImpl.NUMERO_SEGURIDAD);
		strbuf.append(", ");
		strbuf.append(PropiedadVampiroDTOImpl.HABILITADA);
		strbuf.append(", ");
		strbuf.append(PropiedadVampiroDTOImpl.VAMPIRO_REFERENCIA);
		strbuf.append(", ");
		strbuf.append(PropiedadVampiroDTOImpl.CIUDAD_REFERENCIA);
		strbuf.append(", ");
		strbuf.append(PropiedadVampiroDTOImpl.PROPIEDAD_REFERENCIA);

		return strbuf.toString();

	}

	@Override
	protected String createInsertValues(IDTO dto) throws Exception {

		PropiedadVampiroDTOImpl propiedadVampiroDTOImpl = (PropiedadVampiroDTOImpl) dto;

		StringBuffer strbuf = new StringBuffer();

		strbuf.append(propiedadVampiroDTOImpl.getNumeroSirvientes());
		strbuf.append(", ");
		strbuf.append(propiedadVampiroDTOImpl.getNumeroSeguridad());
		strbuf.append(", ");
		strbuf.append(propiedadVampiroDTOImpl.getHabilitada());
		strbuf.append(", ");

		Reference<VampiroDTO> ref1 = propiedadVampiroDTOImpl.getVampiroDTORef();
		ref1.checkInsert();
		strbuf.append(ref1.getIdAsString());
		strbuf.append(",");

		Reference<CiudadDTO> ref = propiedadVampiroDTOImpl.getCiudadDTORef();
		ref.checkInsert();
		strbuf.append(ref.getIdAsString());
		strbuf.append(",");

		Reference<PropiedadDTO> ref2 = propiedadVampiroDTOImpl
				.getPropiedadDTORef();
		ref2.checkInsert();
		strbuf.append(ref2.getIdAsString());

		return strbuf.toString();

	}

	@Override
	protected String createTableColumns() throws Exception {

		StringBuffer strbuf = new StringBuffer();

		VampiroDAO vampiroDAO = (VampiroDAO) //
		AbstractFactoryDAO.getFactoryDAO().getDAO( // 
				VampiroDAO.class, connectionBean);

		CiudadDAO ciudadDAO = (CiudadDAO) //
		AbstractFactoryDAO.getFactoryDAO().getDAO( // 
				CiudadDAO.class, connectionBean);

		PropiedadDAO propiedadDAO = (PropiedadDAO) //
		AbstractFactoryDAO.getFactoryDAO().getDAO( // 
				PropiedadDAO.class, connectionBean);

		strbuf.append(PropiedadVampiroDTOImpl.ID);
		strbuf.append(" INT PRIMARY KEY AUTO_INCREMENT, ");
		strbuf.append(PropiedadVampiroDTOImpl.NUMERO_SIRVIENTES);
		strbuf.append(" INT , ");
		strbuf.append(PropiedadVampiroDTOImpl.NUMERO_SEGURIDAD);
		strbuf.append(" INT , ");
		strbuf.append(PropiedadVampiroDTOImpl.HABILITADA);
		strbuf.append(" BOOLEAN , ");
		strbuf.append(PropiedadVampiroDTOImpl.VAMPIRO_REFERENCIA);
		strbuf.append(" INT REFERENCES ");
		strbuf.append(vampiroDAO.getTableName());
		strbuf.append(",");
		strbuf.append(PropiedadVampiroDTOImpl.CIUDAD_REFERENCIA);
		strbuf.append(" INT REFERENCES ");
		strbuf.append(ciudadDAO.getTableName());
		strbuf.append(",");
		strbuf.append(PropiedadVampiroDTOImpl.PROPIEDAD_REFERENCIA);
		strbuf.append(" INT REFERENCES ");
		strbuf.append(propiedadDAO.getTableName());

		return strbuf.toString();

	}

	@Override
	protected String createUpdateValues(IDTO dto) throws Exception {

		PropiedadVampiroDTOImpl propiedadVampiroDTOImpl = (PropiedadVampiroDTOImpl) dto;

		StringBuffer strbuf = new StringBuffer();

		strbuf.append(PropiedadVampiroDTOImpl.NUMERO_SIRVIENTES);
		strbuf.append(" = ");
		strbuf.append(propiedadVampiroDTOImpl.getNumeroSirvientes());

		strbuf.append(", ");

		strbuf.append(PropiedadVampiroDTOImpl.NUMERO_SEGURIDAD);
		strbuf.append(" = ");
		strbuf.append(propiedadVampiroDTOImpl.getNumeroSeguridad());

		strbuf.append(", ");

		strbuf.append(PropiedadVampiroDTOImpl.HABILITADA);
		strbuf.append(" = ");
		strbuf.append(propiedadVampiroDTOImpl.getHabilitada());

		strbuf.append(", ");

		strbuf.append(PropiedadVampiroDTOImpl.VAMPIRO_REFERENCIA);
		strbuf.append(" = ");
		Reference<VampiroDTO> ref1 = propiedadVampiroDTOImpl.getVampiroDTORef();
		ref1.checkUpdate();
		strbuf.append(ref1.getIdAsString());

		strbuf.append(", ");

		strbuf.append(PropiedadVampiroDTOImpl.CIUDAD_REFERENCIA);
		strbuf.append(" = ");
		Reference<CiudadDTO> ref = propiedadVampiroDTOImpl.getCiudadDTORef();
		ref.checkUpdate();
		strbuf.append(ref.getIdAsString());

		strbuf.append(", ");

		strbuf.append(PropiedadVampiroDTOImpl.PROPIEDAD_REFERENCIA);
		strbuf.append(" = ");
		Reference<PropiedadDTO> ref2 = propiedadVampiroDTOImpl
				.getPropiedadDTORef();
		ref2.checkUpdate();
		strbuf.append(ref2.getIdAsString());

		return strbuf.toString();

	}

	@Override
	protected IDTO internalResultSetToDTO(ResultSet rs, IDTO dto)
			throws Exception {

		PropiedadVampiroDTOImpl ret = (PropiedadVampiroDTOImpl) dto;

		ret.setId(rs.getInt(PropiedadVampiroDTO.ID));
		
		ret.setNumeroSirvientes(rs
				.getInt(PropiedadVampiroDTOImpl.NUMERO_SIRVIENTES));
		ret.setNumeroSeguridad(rs
				.getInt(PropiedadVampiroDTOImpl.NUMERO_SEGURIDAD));
		ret.setHabilitada(rs.getBoolean(PropiedadVampiroDTOImpl.HABILITADA));

		Reference<VampiroDTO> ref1 = ret.getVampiroDTORef();
		ref1.setRefIdent(rs.getInt(PropiedadVampiroDTOImpl.VAMPIRO_REFERENCIA));
		ref1.setRefValue(null);

		Reference<CiudadDTO> ref = ret.getCiudadDTORef();
		ref.setRefIdent(rs.getInt(PropiedadVampiroDTOImpl.CIUDAD_REFERENCIA));
		ref.setRefValue(null);

		Reference<PropiedadDTO> ref2 = ret.getPropiedadDTORef();
		ref2.setRefIdent(rs.getInt(PropiedadVampiroDTOImpl.PROPIEDAD_REFERENCIA));
		ref2.setRefValue(null);

		return ret;

	}

	// --------------------------------------------------------------------------------

	@Override
	public List<IDTO> listAll(int lim, int off) throws Exception {
		StringBuffer strbuf = new StringBuffer();

		strbuf.append("SELECT * FROM ");
		strbuf.append(getTableName());

		if (lim >= 0 && off >= 0) {
			strbuf.append(" LIMIT  ");
			strbuf.append(lim);
			strbuf.append(" OFFSET ");
			strbuf.append(off);
		}

		System.err.println(strbuf.toString());

		ResultSet rs = //
		connection.createStatement().executeQuery(strbuf.toString());

		List<IDTO> ret = new ArrayList<IDTO>();

		while (rs.next()) {
			ret.add(resultSetToDTO(rs));
		}

		return ret;
	}

	// --------------------------------------------------------------------------------

	public List<IDTO> listBy(String key, Object val) //
			throws Exception {

		if (key == null || val == null) {
			throw new IllegalArgumentException("key == null || val == null");
		}

		StringBuffer strbuf = new StringBuffer();

		strbuf.append("SELECT * FROM ");
		strbuf.append(getTableName());

		strbuf.append(" WHERE ");
		strbuf.append(key);
		strbuf.append(" = ");
		strbuf.append(val);

		System.err.println(strbuf.toString());

		ResultSet rs = //
		connection.createStatement().executeQuery(strbuf.toString());

		List<IDTO> ret = new ArrayList<IDTO>();

		while (rs.next()) {
			ret.add(resultSetToDTO(rs));
		}

		return ret;
	}

	public List<PropiedadVampiroDTO> listByVampiroId(int vampiroId) throws SQLException, Exception {
        StringBuffer strbuf = new StringBuffer();

        strbuf.append("SELECT ");
        strbuf.append("*");
        strbuf.append(" FROM ");
        strbuf.append(getTableName());
        strbuf.append(" WHERE ");
        strbuf.append(PropiedadVampiroDTO.VAMPIRO_REFERENCIA);
        strbuf.append(" = ");
        strbuf.append(vampiroId);

        System.err.println(strbuf.toString());

        ResultSet rs = //
        connection.createStatement().executeQuery(strbuf.toString());

        List<PropiedadVampiroDTO> ret = new ArrayList<PropiedadVampiroDTO>();

        while (rs.next()) {
            ret.add((PropiedadVampiroDTO) resultSetToDTO(rs));
        }

        return ret;
    }
	
	public List<PropiedadVampiroDTO> listByCiudadId(int ciudadId) throws SQLException ,Exception {
        StringBuffer strbuf = new StringBuffer();

        strbuf.append("SELECT ");
        strbuf.append("*");
        strbuf.append(" FROM ");
        strbuf.append(getTableName());
        strbuf.append(" WHERE ");
        strbuf.append(PropiedadVampiroDTO.CIUDAD_REFERENCIA);
        strbuf.append(" = ");
        strbuf.append(ciudadId);

        System.err.println(strbuf.toString());

        ResultSet rs = //
        connection.createStatement().executeQuery(strbuf.toString());

        List<PropiedadVampiroDTO> ret = new ArrayList<PropiedadVampiroDTO>();

        while (rs.next()) {
            ret.add((PropiedadVampiroDTO) resultSetToDTO(rs));
        }

        return ret;
    }
	
}
